﻿#include <iostream>
#include <codecvt>
#include <cassert>
#include <cwchar>
#include <numbers>
#include <cmath>  // 用于标准数学函数 sin, cos, log 等

int main()
{
	// 创建一个 UTF-8 到 UTF-16 的转换器
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;

	// 原始的 UTF-8 字符串
	std::string narrow_string = "Hello, World!";

	// 转换为 UTF-16 宽字符串
	std::wstring wide_string = converter.from_bytes(narrow_string);

	// 输出宽字符串
	std::wcout << L"Wide string: " << wide_string << std::endl;

	// 将宽字符串转换回 UTF-8 字符串
	std::string converted_string = converter.to_bytes(wide_string);

	// 输出转换后的字符串
	std::cout << "Converted string: " << converted_string << std::endl;




	//<cassert> 是 C++ 标准库中的一个头文件，它提供了断言功能
	int a = 5;
	int b = 3;

	// 检查 a 是否大于 b
	assert(a > b);

	// 如果 a 不大于 b，程序将在这里终止，并输出错误信息
	std::cout << "a is greater than b" << std::endl;





	//<cwchar> 是 C++ 标准库中的一个头文件，提供了处理宽字符（wchar_t）和宽字符串的函数
	// 使用 fputws 和 fgetws 进行宽字符串输入输出
  /*  const wchar_t* filename = L"example.txt";
	FILE* file = std::fopen("example.txt", "w");
	if (file) {
		std::fputws(L"Hello, 世界!\n", file);
		std::fclose(file);
	}

	file = std::fopen("example.txt", "r");
	if (file) {
		wchar_t buffer[256];
		if (std::fgetws(buffer, 256, file)) {
			std::wcout << L"Read from file: " << buffer;
		}
		std::fclose(file);
	}*/




	//<climits> 是 C++ 标准库中的一个头文件，提供了与整数类型相关的限制和特性
	// 打印整型的最大值和最小值
	std::cout << "int 的最大值是：" << INT_MAX << std::endl;
	std::cout << "int 的最小值是：" << INT_MIN << std::endl;

	// 打印长整型的最大值和最小值
	std::cout << "long 的最大值是：" << LONG_MAX << std::endl;
	std::cout << "long 的最小值是：" << LONG_MIN << std::endl;

	// 打印无符号长整型的最大值
	std::cout << "unsigned long 的最大值是：" << ULONG_MAX << std::endl;

	// 打印字符类型的最大值和最小值
	std::cout << "char 的最大值是：" << CHAR_MAX << std::endl;
	std::cout << "char 的最小值是：" << CHAR_MIN << std::endl;






	//<cfloat> 是 C++ 标准库中的一个头文件，用于定义浮点数相关的宏和常量
	 // 输出 float 类型的范围和精度
	std::cout << "float:\n";
	std::cout << "Min: " << FLT_MIN << '\n';
	std::cout << "Max: " << FLT_MAX << '\n';
	std::cout << "Epsilon: " << FLT_EPSILON << '\n';
	std::cout << "Digits: " << FLT_DIG << '\n';

	// 输出 double 类型的范围和精度
	std::cout << "\ndouble:\n";
	std::cout << "Min: " << DBL_MIN << '\n';
	std::cout << "Max: " << DBL_MAX << '\n';
	std::cout << "Epsilon: " << DBL_EPSILON << '\n';
	std::cout << "Digits: " << DBL_DIG << '\n';

	// 输出 long double 类型的范围和精度
	std::cout << "\nlong double:\n";
	std::cout << "Min: " << LDBL_MIN << '\n';
	std::cout << "Max: " << LDBL_MAX << '\n';
	std::cout << "Epsilon: " << LDBL_EPSILON << '\n';
	std::cout << "Digits: " << LDBL_DIG << '\n';





	//<cstdlib> 是 C++ 标准库中的一个头文件，提供了各种通用工具函数，包括内存分配、进程控制、环境查询、排序和搜索、数学转换、伪随机数生成等
	int* ptr = (int*)malloc(10 * sizeof(int)); // 分配内存
	if (ptr == NULL) {
		std::cout << "Memory allocation failed." << std::endl;
		return 1;
	}

	for (int i = 0; i < 10; ++i) {
		ptr[i] = i * i; // 使用分配的内存
	}

	for (int i = 0; i < 10; ++i) {
		std::cout << "Element " << i << ": " << ptr[i] << std::endl;
	}

	free(ptr); // 释放内存








	//using namespace std;

	////std::numbers 是 C++20 中引入的一个标准库模块，主要用于提供一组常用的数学常量

	//// 打印圆周率 π 的值
	//cout << "圆周率 pi 的值是: " << numbers::pi << endl;

	//// 打印自然对数的底数 e 的值
	//cout << "自然常数 e 的值是: " << numbers::e << endl;

	//// 打印根号2 (sqrt2) 的值
	//cout << "根号2 (sqrt2) 的值是: " << numbers::sqrt2 << endl;

	//// 打印根号3 (sqrt3) 的值
	//cout << "根号3 (sqrt3) 的值是: " << numbers::sqrt3 << endl;

	//// 打印黄金比例 phi 的值
	//cout << "黄金比例 phi 的值是: " << numbers::phi << endl;

	//// 打印欧拉-马歇罗尼常数 egamma 的值
	//cout << "欧拉-马歇罗尼常数 egamma 的值是: " << numbers::egamma << endl;

	//// 打印 1/π (inv_pi) 的值
	//cout << "1/π (inv_pi) 的值是: " << numbers::inv_pi << endl;

	//// 打印 1/√π (inv_sqrtpi) 的值
	//cout << "1/√π (inv_sqrtpi) 的值是: " << numbers::inv_sqrtpi << endl;

	//// 打印以 2 为底的 e 的对数 log2e 的值
	//cout << "以 2 为底的 e 的对数 log2e 的值是: " << numbers::log2e << endl;

	//// 打印以 10 为底的 e 的对数 log10e 的值
	//cout << "以 10 为底的 e 的对数 log10e 的值是: " << numbers::log10e << endl;

	//// 打印 sin(π/2) 的值
	//cout << "sin(π/2) 的值是: " << sin(numbers::pi / 2) << endl;

	//// 打印 cos(π) 的值
	//cout << "cos(π) 的值是: " << cos(numbers::pi) << endl;

	//// 打印 ln(e) 的值
	//cout << "ln(e) 的值是: " << log(numbers::e) << endl;

	//// 演示使用不同的数据类型
	//float pi_f = numbers::pi_v<float>;  // 使用 float 类型的 pi

	//long double pi_ld = numbers::pi_v<long double>;  // 使用 long double 类型的 pi
	//
	//// 计算不同精度的值
	//cout << "\nsin(π/2) 使用 double: " << sin(numbers::pi / 2) << endl;
	//cout << "sin(π/2) 使用 float: " << sin(static_cast<float>(numbers::pi) / 2) << endl;
	//cout << "sin(π/2) 使用 long double: " << sin(static_cast<long double>(numbers::pi) / 2) << endl;




}
